迭代器模式 Iterator Pattern

设计原则 九:

单一责任原则,一个类应该只有一个引起变化的原因。
将一个责任只委派给一个类。
类的每个责任都有一个潜在的改变区域,超过一个责任意味着超过一个改变区域,

定义迭代器模式:

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

用迭代器来封装集合对象的遍历细节,使调用者能够通过统一的接口来实现对集合的遍历,迭代器也给集合对象提供了一定的保护,想要遍历集合,直接调用迭代器的方法就好了,我们不知道也不必知道集合内部的数据管理方式。

类图

例图

代码

迭代器接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package IteratorPattern;

/**
* 定义迭代器
*/
public interface Iterator {
/**
* @return 集合内是否存在下一个元素
*/
public abstract boolean hasNext();
/**
* @return 返回集合内的下一个元素
*/
public abstract Object next();
}

还需要实现一些具体的迭代器来实现遍历细节:
Array迭代器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package IteratorPattern;

/**
* 实现数组迭代器
*/
public class ArrayIterator implements Iterator{
MyObject[] arr; //自定义对象数组
int index = 0; //当前索引

public ArrayIterator(MyObject[] arr){
this.arr = arr;
}

@Override
public boolean hasNext() {
if(index < arr.length && arr[index] != null)
return true;

return false;
}

@Override
public Object next() {
MyObject mo = arr[index];
index++;

return mo;
}
}

P.S.注意Array迭代器的hasNext方法的具体实现
List迭代器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package IteratorPattern;
import java.util.List;

/**
* 实现List迭代器
*/
public class ListIterator implements Iterator{
List<MyObject> list; //集合对象
int index = 0; //当前索引

public ListIterator(List<MyObject> list){
this.list = list;
}

@Override
public boolean hasNext() {
if(index < list.size())
return true;

return false;
}

@Override
public Object next() {
MyObject mo = list.get(index);
index++;

return mo;
}
}

有了这些具体迭代器,我们只需要一个循环就可以搞定了:

1
2
3
4
5
6
7
8
9
/**
* 打印集合所有内容
* @param iter 集合的迭代器
*/
private static void printObjs(Iterator iter){
while(iter.hasNext()){
System.out.println(iter.next().toString());
}
}